package com.example.demo.controller;

import com.example.demo.common.AppVarible;
import com.example.demo.common.PasswordUtils;
import com.example.demo.common.ResultAjax;
import com.example.demo.common.SessionUtils;
import com.example.demo.dao.UserMapper;
import com.example.demo.model.Userinfo;
import com.example.demo.model.vo.UserinfoVO;
import com.example.demo.service.UserService;
//import org.junit.Test;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
import org.springframework.context.ApplicationContext;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.support.StandardServletEnvironment;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.*;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;
    /**
     * 注册功能
     */
    @RequestMapping("/reg")
    public ResultAjax reg(Userinfo userinfo){

        // 1. 校验参数
        if (userinfo == null || !StringUtils.hasLength(userinfo.getUsername())
                || !StringUtils.hasLength(userinfo.getPassword())){
            return ResultAjax.fail(-1,"非法参数");
        }
        // 密码加盐 ， 同时登录的时候要进行加盐的解密
        userinfo.setPassword(PasswordUtils.encrypt(userinfo.getPassword()));
        // 2. 请求 service 进行添加操作
        int result = userService.reg(userinfo);
        // 3. 将执行的结果返回给前端
        return ResultAjax.succ(result);
    }

    @RequestMapping("/login")
    public ResultAjax login(UserinfoVO userinfoVO, HttpServletRequest request){
        // 1. 参数校验
        if (userinfoVO == null || !StringUtils.hasLength(userinfoVO.getUsername()) ||
                !StringUtils.hasLength((userinfoVO.getPassword()))){
            // 非法登录
            return ResultAjax.fail(-1,"参数有误");
        }
        // 2. 根据用户名查询对象
        Userinfo userinfo = userService.getUserByName(userinfoVO.getUsername());
        if (userinfo == null || userinfo.getId() == 0){
            // 不存在此用户
            return ResultAjax.fail(-2,"用户名或密码错误");

        }
        // 3. 使用对象中的密码和用户输入的密码进行比较
        // 加盐解密
        if (!PasswordUtils.decrypt(userinfoVO.getPassword(), userinfo.getPassword())){
            return ResultAjax.fail(-2,"用户名或密码错误");

        }
        // 4. 比较成功之后，将对象存储到 session 中
        HttpSession session = request.getSession();
        session.setAttribute(AppVarible.SESSION_USERINFO_KEY,userinfo);
        // 5. 将结果返回给用户
        return ResultAjax.succ(1);

    }

    /**
     *
     * 添加头像并进行保存方便更改头像
     */
    @RequestMapping("/addPhoto")
    public ResultAjax addPhoto(@RequestParam("upload_image")MultipartFile photoFile,
                               HttpServletRequest request, HttpServletResponse resp) throws IOException {
        Userinfo userinfo = SessionUtils.getUser(request);
        // 首先进行参数校验，看是否登录
        if (userinfo == null || !StringUtils.hasLength(userinfo.getUsername()) ||
                !StringUtils.hasLength((userinfo.getPassword()))){
            // 非法登录
            return ResultAjax.fail(-1,"参数有误");
            //return;
        }
        // 1. 拿到用户id 知道当然是哪一个用户对头像进行上传
        int userId = userinfo.getId();
        // 2. 拿到表单提交的数据即一个图片文件，并创建对象进行赋值
        // 本地运行时的地址
        //File file = new File("D:\\bitStudy\\bit_java\\blog_sm_Photo\\" + userId +".jpg");
        // 部署到云服务器时的地址
        File file = new File(System.getProperty("user.dir") + "/blog_sm_Photo/" + userId +".jpg");
        if (file.exists()){
            file.delete();
        }
        file.createNewFile();
        // 3. 将这个图片文件进行保存，并命名用户的信息方便更改的时候查找
//        int len = 0;
//        byte[] fileCopy = new byte[20 * 1024 * 1024];
//        InputStream reader = new FileInputStream(upload_image);
//        while(true){
//            len = reader.read(fileCopy);
//            if (len == -1){
//                break;
//            }
//        }
        byte[] fileCopy = photoFile.getBytes();
//        for (byte b : fileCopy){
//            System.out.println(b);
//        }
        //System.out.println(fileCopy);
//        System.out.println(fileCopy.length);
//        System.out.println("111111111111111111111111111111111111111111111111111");
        OutputStream os = new FileOutputStream(file);
        os.write(fileCopy);
        os.flush();
        resp.sendRedirect("../myblog_list.html");
        return ResultAjax.succ(1);

    }

//    @Test
//    public void testFile() throws IOException {
//        File file1 = new File("src/main/resources/static/img/avatar1.png");
//        int len = 0;
//        byte[] fileCopy = new byte[1024 * 1024];
//        InputStream reader = new FileInputStream(file1);
//        while(true){
//            len = reader.read(fileCopy);
//            if (len == -1){
//                break;
//            }
//        }
//        File file = new File("src/main/java/com/example/demo/Photo/"+ "1" +".png");
//        file.createNewFile();
//        OutputStream os = new FileOutputStream(file);
//        os.write(fileCopy);
//        os.flush();
//        //System.out.println(file.getAbsolutePath());
//    }
    /**
     * 注销
     */
    @RequestMapping("/logout")
    public ResultAjax logout(HttpServletRequest request){
        HttpSession session = request.getSession(false);
        if (session != null && session.getAttribute(AppVarible.SESSION_USERINFO_KEY) != null){
            session.removeAttribute(AppVarible.SESSION_USERINFO_KEY);
        }
        return ResultAjax.succ(1);
    }
}
